A Philosophy of Software Design